package edzest.basic;

public class J12_SungJuk_v4b {
	// <<클래스 작성 순서>>
	// 1. private 멤버변수 선언
	// 2. 멤버변수 초기화할 생성자 작성
	// 3. 멤버변수에 대한 setter/getter 메서드 작성
	// 4. 모든 멤버변수 값을 출력하는 toString 메서드 작성

	public static void main(String[] args) {
		// 접근 지정자를 이용해서 SungJuk 클래스 정의
		// J12SungJuk sj = new J12SungJuk(); //에러
		// 생성자 재정의하면 기본 생성자는 없어짐
		// sj.name = "지현"; //에러
		// 이렇게 변수에 접근하는 것은 객체지향에 맞지 않음
		J12SungJuk sj = new J12SungJuk("지현", 98, 45, 12);
		// System.out.println( sj.name); // 에러
		// 생성자로 멤버 초기화시켜도 private때문에 접근은 불가
		
		// 따라서 private으로 선언된 멤버변수를 
		// 조작하거나 값을 읽어올려면
		// 그것을 위한 특별한 메서드를 작성하는 것이 좋음
		// 실무에서는 setter/getter 메서드를 작성함
		sj.setName( "수지" ); // 메서드로 값을 조작
		System.out.println( sj.getName() ); // 메서드로 값을 가져옴
		sj.setKor(95);
		System.out.println( sj.getKor() );
		sj.setEng(96);
		System.out.println( sj.getEng() );
		sj.setMat(89);
		System.out.println( sj.getMat() );
		
		// toString() 메서드를 이용해서
		// 객체의 모든 멤버변수를 출력하기
		// 위처럼 println으로 많이 출력하면
		// 성능이 떨어지므로 toString으로 한번에 출력하는게 좋음
		System.out.println( sj.toString() );

	} // main

} // class

class J12SungJuk{
	// private 멤버는 해당 클래스 내에서만 사용가능
	private String name;
	private int kor;
	private int eng;
	private int mat;
	
	private int tot;
	private double avg;
	private char grd;
	
	public J12SungJuk(String name, int kor, int eng, int mat) {
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
	}
	
	// setter 메서드 : 멤버변수에 값을 set하기 위한 메서드
	// public void set멤버변수명( 자료형 멤버변수명 ){
	//	 	this.멤버변수명 = 멤버변수명;
	// }
	public void setName( String name ){
		this.name = name;
	}
	
	// getter 메서드 : 멤버변수의 값을 get하기 위한 메서드
	// public 멤버변수자료형  get멤버변수명(){
	//	 	return 멤버변수명;
	// }
	public String getName(){
		return name;
	}
	
	public void setKor( int kor ){
		this.kor = kor;
	}
	
	public int getKor(){
		return kor;
	}
	
	public void setEng( int eng ){
		this.eng = eng;
	}
	
	public int getEng(){
		return eng;
	}
	
	public void setMat( int mat ){
		this.mat = mat;
	}
	
	public int getMat(){
		return mat;
	}
	
	public void setTot(int kor, int eng, int mat){
		tot = kor + eng + mat;
	}
	
	
	// 객체지향 프로그래밍에서는
	// 메서드에 너무 많은 책임을 부여하는 것을 금지하고 있음
	// getTot 메서드를 살펴보면
	// 단순히 tot 변수의 값을 읽어오는 기능외에
	// 입력한 성적데이터에 대한 총점을 구하는 기능도 포함
	public int getTot(){
		tot = kor + eng + mat;
		// 메소드 내에 tot = kor + eng + mat;과 같은
		// 계산같은 기능을 넣으면 안좋다
		// 다른 사람이 분석할때 안좋음
		// 그래서 필드지정 클래스, 메소드기능지정 클래스 나눠만듬
		// 나눠만드는건 인터페이스 배우고 배움
		//setTot(kor, eng, mat);
		return tot;
	}
	
	public double getAvg(){
		avg = tot / 3;
		return avg;
	}
	
	public char getGrd(){
		//switch(avg/10){
		//Cannot switch on a value of type double.
		//Only convertible int values, strings 
		//or enum variables are permitted
		switch((int)avg/10){
			case 10: case 9: grd = '수'; break;
			case 8: grd = '우'; break;
			case 7: grd = '미'; break;
			case 6: grd = '양'; break;
			default: grd = '가'; 
		}
		return grd;
	}
	
	// 멤버변수의 모든 값을 출력하기 위해
	// Object 클래스가 기본적으로 제공하는
	// 메서드인 toString()을 재정의override
	@Override // 어노테이션: 일종의 주석, 사람을 위한 주석이 아닌 컴파일러를 위한 주석
	public String toString() {
		String result = "";
		result = result + "이름 : " + name;
		result += " 국어 : " + kor;
		result += " 영어 : " + eng ;
		result += " 수학 : " + mat;
		result += " 총점 : " + getTot();
		result += " 평균 : " + getAvg();
		result += " 학점 : " + getGrd(); //getGrd()에 대고 F3누르면 해당 메서드로 바로감
		return result;
		//return super.toString();
	}
}
